"""
SqlAlchermy Column常用参数
1. default：默认值。
2. nullable：是否可空。
3. primary_key：是否为主键。
4. unique：是否唯一。
5. autoincrement：是否自动增长。
6. onupdate：更新的时候执行的函数。
7. name：该属性在数据库中的字段映射。
"""
import os
import sys

path = os.path.dirname(__file__)
sys.path.append(os.path.join(path, ".."))

import random
import string
from datetime import datetime
from sqlalchemy import Column, String, DateTime, Integer
from conf.mysql_config import BASE, SESSION


def gen_article_id():
    now = datetime.now().strftime('%Y%m%d%H%M%S')
    random_str = now + ''.join(random.sample(string.ascii_uppercase + string.digits, 10))
    return random_str


class ArticleOrm(BASE):
    __tablename__ = 'article'
    # primary_key、autoincrement：主键、自增长
    id = Column(Integer, autoincrement=True, primary_key=True)
    # nullable：是否可空，默认可为空
    # name：该属性在数据库中的字段映射，不指定默认为属性名称-> title
    title = Column(String(150), nullable=False, name='article_title', comment='文章名称', doc={'zh': '文章名称'})
    author = Column(String(50), nullable=False, comment='作者', doc={'zh': '作者'})
    # unique：是否唯一
    article_id = Column(String(50), nullable=False, unique=True, default=gen_article_id, comment='编码', doc={'zh': '编号'})
    # default：默认值
    read_count = Column(Integer, nullable=False, default=0, comment='阅读量', doc={'zh': '阅读量'})
    # default：默认值
    create_time = Column(DateTime, default=datetime.now, comment='创建时间', doc={'zh': '创建时间'})
    # default：默认值
    # onupdate：更新的时候执行的函数，例：执行更新的时候将当前时间自动存储为更新时间
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间', doc={'zh': '更新时间'})


BASE.metadata.create_all()


def add_data():
    # article1 = ArticleOrm(title='西游记', author='吴承恩')
    # SESSION.add(article1)
    # SESSION.commit()

    # 测试update_time：onupdate
    article = SESSION.query(ArticleOrm).filter_by(title='西游记', author='吴承恩').first()
    # article.read_count += 1
    # SESSION.commit()

    # 测试article_id： unique=True，是否唯一
    print(article.article_id)
    article2 = ArticleOrm(title='三国演义', author='罗贯中', article_id=article.article_id)
    SESSION.add(article2)
    SESSION.commit()


if __name__ == '__main__':
    add_data()
